package dimension.starry.item.weapon;

import dimension.starry.constants.ItemQuality;
import dimension.starry.constants.WeaponAttribute;
import dimension.starry.item.typeInterface.WeaponType.SwordType;
import dimension.starry.item.typeInterface.WeaponType.WeaponType;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * @author 150149
 */
public class FirstSword extends SwordType {

    private static final LinkedHashMap<WeaponAttribute, Double> BASE_ATTRIBUTE_MAP = new LinkedHashMap<>() {{
        put(WeaponAttribute.SMALL_DAMAGE, 39.0);
        put(WeaponAttribute.BIG_DEFENSE, 0.096);
    }};
    private static final List<Double> SMALL_DAMAGE_LIST = new ArrayList<>() {{
        add(5.8);
        add(8.7);
        add(11.6);
        add(14.5);
        add(17.4);
        add(20.3);
        add(23.2);
        add(26.1);
        add(29.9);
        add(31.9);

        add(34.8);
        add(37.7);
        add(40.6);
        add(43.5);
        add(46.4);
        add(50.3);
        add(53.2);
        add(56.1);
        add(59.0);
        add(61.9);
    }};
    private static final List<Double> BIG_DEFENSE_LIST = new ArrayList<>() {{
        add(0.0998);
        add(0.1036);
        add(0.1074);
        add(0.1112);
        add(0.1150);
        add(0.1188);
        add(0.1226);
        add(0.1264);
        add(0.1302);
        add(0.1340);

        add(0.1378);
        add(0.1416);
        add(0.1454);
        add(0.1492);
        add(0.1530);
        add(0.1568);
        add(0.1606);
        add(0.1664);
        add(0.1682);
        add(0.1720);
    }};
    private static final LinkedHashMap<WeaponAttribute, List<Double>> LEVEL_UP_ATTRIBUTE_MAP = new LinkedHashMap<>() {{
        put(WeaponAttribute.SMALL_DAMAGE, SMALL_DAMAGE_LIST);
        put(WeaponAttribute.BIG_DEFENSE, BIG_DEFENSE_LIST);
    }};
    private static final List<Text> DESC_LIST = new ArrayList<>() {{
        add(Text.translatable("starry_dimension.first_sword.desc.1"));
        add(Text.translatable("starry_dimension.first_sword.desc.2"));
    }};

    public FirstSword() {
        super(new FabricItemSettings().maxDamage(100));
    }

    @Override
    public ItemQuality getQuality() {
        return ItemQuality.EXCELLENT;
    }

    @Override
    public LinkedHashMap<WeaponAttribute, Double> getBaseAttributeMap() {
        return BASE_ATTRIBUTE_MAP;
    }

    @Override
    public LinkedHashMap<WeaponAttribute, List<Double>> getLevelUpAttributeMap() {
        return LEVEL_UP_ATTRIBUTE_MAP;
    }

    @Override
    public List<Text> getDescription() {
        return DESC_LIST;
    }

    @Override
    public boolean postHit(ItemStack itemStack, LivingEntity target, LivingEntity attacker) {
        super.postHit(itemStack, target, attacker);
        if (target.isDead() && attacker instanceof PlayerEntity) {
            float healHealth = attacker.getMaxHealth() * (WeaponType.getMergeCount(itemStack) * 0.02f + 0.06f);
            float finalHealth = healHealth + attacker.getHealth();
            attacker.setHealth(Math.min(finalHealth, attacker.getMaxHealth()));
        }
        return true;
    }
}
